import time
import pygame
import random


# 创建一个玩家飞机的类
class HeroPlane(pygame.sprite.Sprite):
    def __init__(self, screen):
        # 这个精灵的初始化方法 必须调动
        pygame.sprite.Sprite.__init__(self)

        # 创建一个图片当玩家飞机
        self.player = pygame.image.load(r"C:\Users\acer\Desktop\IDE\Python\dddd\images\me1.png")

        # 根据图片image获取矩形对象
        self.rect = self.image.get_rect()  # rect: 矩形
        self.rect.topleft = [1000 / 2 - 120 / 2, 600]

        # 加上self 初始化
        # 定义飞机的坐标
        #self.x = 1000 / 2 - 120 / 2
        #self.y = 600
        # 飞机速度
        self.speed = 10

        # 记录当前的窗口对象
        self.screen = screen

        # 装子弹的列表
        self.bullets = pygame.sprite.Group()

    def key_control(self):
        # 监听键盘事件
        key_pressed = pygame.key.get_pressed()  # key：键盘；get_pressed：按着

        if key_pressed[pygame.K_w] or key_pressed[pygame.K_UP]:
            print("上")
            self.rect.top -= self.speed
        if key_pressed[pygame.K_s] or key_pressed[pygame.K_DOWN]:
            print("下")
            self.rect.bottom += self.speed
        if key_pressed[pygame.K_a] or key_pressed[pygame.K_LEFT]:
            print("左")
            self.rect.left -= self.speed
        if key_pressed[pygame.K_d] or key_pressed[pygame.K_RIGHT]:
            print("右")
            self.rect.right += self.speed
        if key_pressed[pygame.K_SPACE]:
            # 按下空格键发射子弹
            bullet = Bullet(self.screen, self.rect.left, self.y)
            # 把子弹放到列表里
            self.bullets.add(bullet)

    def update(self):
        self.key_control()
        self.display()

    def display(self):
        # 将玩家飞机图片贴到窗口中
        self.screen.blit(self.player, self.rect)
        # 更新子弹的坐标
        self.bullets.update()

        # 把所有子弹全部添加到屏幕
        self.bullets.draw(self.screen)

        # 遍历所有子弹
        # for bullet in self.bullets:
        # 让子弹飞 修改子弹y坐标
        # bullet.auto_move()
        # 子弹显示在窗口
        # bullet.display()


# 创建一个敌机类
class EnemyPlane(pygame.sprite.Sprite):
    def __init__(self, screen):
        # 这个精灵的初始化方法 必须调动
        pygame.sprite.Sprite.__init__(self)

    # 创建一个图片当玩家飞机
        self.player = pygame.image.load(r"C:\Users\acer\Desktop\IDE\Python\dddd\images\enemy1.png")

    # 根据图片image获取矩形对象
        self.rect = self.image.get_rect()  # rect: 矩形
        self.rect.topleft = [0, 0]

    # 加上self 初始化
    # 定义飞机的坐标
    # self.x = 1000 / 2 - 120 / 2
    # self.y = 600
    # 飞机速度
        self.speed = 10

        # 记录当前的窗口对象
        self.screen = screen

        # 装子弹的列表
        self.bullets = pygame.sprite.Group()

        # 敌机移动方向
        self.direction = 'right'

    def display(self):
        # 将玩家飞机图片贴到窗口中
        self.screen.blit(self.player, self.rect)
        # 更新子弹的坐标
        self.bullets.update()

        # 把所有子弹全部添加到屏幕
        self.bullets.draw(self.screen)

    def update(self):
        self.auto_move()
        self.auto_fire()
        self.display()

    def auto_move(self):
        if self.direction == 'right':
            self.rect.right += self.speed
        elif self.direction == 'left':
            self.rect.right -= self.speed

        if self.rect.right > 1000 - 102:
            self.direction = 'left'
        elif self.rect.right < 0:
            self.direction = 'right'

    def auto_fire(self):
        """自动开火  创建子弹对象  添加进列表"""
        random_num = random.randint(1, 15)
        if random_num == 8:
            bullet = EnemyBullet(self.screen, self.rect.left, self.rect.top)
            self.bullets.add(bullet)


# 子弹类
# 属性
class Bullet(pygame.sprite.Sprite):
    def __init__(self, screen, x, y):
        pygame.sprite.Sprite.__init__(self)

        # 创建图片
        self.image = pygame.image.load(r"C:\Users\acer\Desktop\IDE\Python\dddd\images\bullet1.png")

        # 获取矩形对象
        self.rect = self.image.get_rect()
        self.rect.topleft = [x + 60 - 8.5, y - 35]

        # 坐标
        # self.x = x + 60 - 8.5
        # self.y = y - 35
        # 图片
        # self.image = pygame.image.load(r"C:\Users\acer\Desktop\IDE\Python\dddd\images\bullet1.png")

        # 窗口
        self.screen = screen
        # 速度
        self.speed = 10

    # def display(self):
        # """显示子弹到窗口"""
        # self.screen.blit(self.image, (self.x, self.y))

    # def auto_move(self):
        # """让子弹飞 修改子弹y坐标"""
        # self.y -= self.speed
    def update(self):
        # 修改子弹坐标
        self.rect.top -= self.speed
        # 如果子弹移出屏幕上方 则销毁子弹对象
        if self.rect.top < -35:
            self.kill()


# 敌方子弹类
# 属性
class EnemyBullet(object):
    def __init__(self, screen, x, y):
        pygame.sprite.Sprite.__init__(self)

        # 创建图片
        self.image = pygame.image.load(r"C:\Users\acer\Desktop\IDE\Python\dddd\images\bullet3.png")

        # 获取矩形对象
        self.rect = self.image.get_rect()
        self.rect.topleft = [x + 102 / 2 - 17 / 2, y + 60]

        # 坐标
        # self.x = x + 102 / 2 - 17 / 2
        # self.y = y + 60
        # 图片
        # self.image = pygame.image.load(r"C:\Users\acer\Desktop\IDE\Python\dddd\images\bullet3.png")  # 17*35

        # 窗口
        self.screen = screen
        # 速度
        self.speed = 10

    # def display(self):
        # """显示子弹到窗口"""
        # self.screen.blit(self.image, (self.x, self.y))

    # def auto_move(self):
        # """让子弹飞 修改子弹y坐标"""
        # self.y += self.speed

    def update(self):
        # 修改子弹坐标
        self.rect.top += self.speed
        # 如果子弹移出屏幕上方 则销毁子弹对象
        if self.rect.top > 852:
            self.kill()


# 创建背景音乐
# class GameSound(object):
#    def __init__(self):
#        pygame.mixer.init()  # 音乐模块初始化
#        pygame.mixer.music.load(r"C:\Users\acer\Desktop\IDE\Python\dddd\images\I need somebody.ogg")
#        pygame.mixer.music.set_volume(0.5)  # 声音大小

#    @staticmethod
#    def playbackgroundmusic():
#        pygame.mixer.music.play(-1) # 开始播放声音  -1表示无限循环播放


def main():
    """完成整个程序的控制"""
    # sound = GameSound()
    # sound.playbackgroundmusic()

    # 创建一个窗口
    screen = pygame.display.set_mode((1000, 700), 0, 32)
    # 创建一个图片当作背景
    background = pygame.image.load(r"C:\Users\acer\Desktop\IDE\Python\dddd\images\background.png")
    # 创建一个飞机的对象，主义不要忘记传窗口
    player = HeroPlane(screen)
    # 创建一个敌方飞机的对象，主义不要忘记传窗口
    enemyplane = EnemyPlane(screen)

    while True:
        # 将背景图片贴到窗口中
        screen.blit(background, (0, 0))

        # 遍历所有的事件
        for event in pygame.event.get():
            # 判断事件类型如果是pygame的退出
            if event.type == pygame.QUIT:  # QUIT：退出；type：类型
                # 执行pygame退出
                pygame.quit()
                # python程序退出
                exit()

        # 执行飞机的按键监听
        player.key_control()
        # 调用display方法显示飞机
        player.display()
        # 调用display方法显示敌方飞机
        enemyplane.display()
        # 敌机自动移动
        enemyplane.auto_move()
        # 敌机自动开火
        enemyplane.auto_fire()

        # 更新需要显示窗口中的内容
        pygame.display.update()
        time.sleep(0.01)


if __name__ == '__main__':
    main()
